#include<iostream>
using namespace std;

//class Base
//{
//public:
//	virtual void Print()
//	{
//		cout << "Base::Print()" << endl;
//	}
//};
//
//class Derive :public Base
//{
//	virtual void Print()
//	{
//		cout << "Derive::Print()" << endl;
//	}
//};
//
////void Func(Base* b)
//void Func(Base& b)
//{
//	//b->Print();
//	b.Print();
//}
//
//int main()
//{
//	Base b;
//	Derive d;
//	Func(b);
//	Func(d);
//	
//	/*Func(&b);
//	Func(&d);*/
//	return 0;
//}

//class A{};
//class B :public A{};
//
//class Base
//{
//public:
//	virtual A* Func1()
//	{
//		return new A;
//	}
//
//	virtual Base* Func2()
//	{
//		return new Base;
//	}
//};
//
//class Derive :public Base
//{
//	virtual B* Func1()
//	{
//		return new B;
//	}
//
//	virtual Derive* Func2()
//	{
//		return new Derive;
//	}
//};

//class Base
//{
//public:
//	~Base()
//	{
//		cout << "~Base()" << endl;
//	}
//};
//
//class Derive :public Base
//{
//public:
//	~Derive()
//	{
//		cout << "~Derive()" << endl;
//	}
//};
//
//int main()
//{
//	Base* p1 = new Base;
//	Base* p2 = new Derive;
//	
//	delete p1;
//	delete p2;
//
//	return 0;
//}

//class Base
//{
//public:
//	virtual void Func() = 0;
//};
//
//class Derive :public Base
//{
//public:
//	virtual void Func()
//	{
//		cout << "Derive::Func()" << endl;
//	}
//};
//
//int main()
//{
//	//Base b;
//	Derive d;
//	d.Func();
//	return 0;
//}

class Base
{
	virtual void Func1()
	{
		cout << "Base::virtual void Func1()" << endl;
	}
	virtual void Func2()
	{
		cout << "Base::virtual void Func2()" << endl;
	}
	void Func3()
	{
		cout << "Base::void Func3()" << endl;
	}
private:
	int _b = 1;
};

class Derive :public Base
{
	virtual void Func1()
	{
		cout << "Derive::virtual void Func1()" << endl;
	}
private:
	int _d = 2;
};

int main()
{
	Base b;
	cout << sizeof(b) << endl;
	Derive d;
	return 0;
}